package com.je.app.control;


import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.Timer;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

import com.je.app.control.interfaces.ControlHabitacionInterface;
import com.je.app.model.BajaConsumicion;
import com.je.app.model.Consumicion;
import com.je.app.model.EstadoHabitacion;
import com.je.app.model.Habitacion;
import com.je.app.model.Observacion;
import com.je.app.model.TipoHabitacion;
import com.je.app.model.Turno;
import com.je.app.persistence.DaoHabitacion;
import com.je.app.persistence.DaoSesion;
import com.je.app.persistence.DaoStock;
import com.je.app.persistence.DaoTurno;
import com.je.app.persistence.HibernateUtil;
import com.je.app.view.Habitaciones;
import com.je.app.view.MainFrame;
import com.je.app.view.MainFrame.MessageType;
import com.je.app.view.popUp.AgregarConsumicion;
import com.je.app.view.popUp.FinTurno;
import com.je.app.view.popUp.IniciarTurno;
import com.je.app.view.popUp.ProntoFinTurno;

public class ControlHabitacion implements ControlHabitacionInterface{

	private static ControlHabitacion instance;

	private MainFrame mainFrame ;
	private DaoTurno daoTurno = DaoTurno.getInstance();
	private DaoHabitacion daoHabitacion = DaoHabitacion.getInstance();

	private List <Turno> turnosVigentes = null;
	private List <Timer> timers = null;
	private List <Habitacion> habitaciones = null;
	private List <Integer> tablaConsumiciones = null;
	private List <Integer> listaConsumicionesPermitidas = null;
	
	public static ControlHabitacion getInstance(){
		if(instance==null){
			instance = new ControlHabitacion();
		}
		return instance;
	}
	
	private ControlHabitacion(){
		mainFrame = MainFrame.getInstance();
		turnosVigentes = daoTurno.getInitiated();
		habitaciones = daoHabitacion.list(Habitacion.class.getName());
		timers = new ArrayList <Timer>();
		Date fechaActual = new Date();
		for(final Turno turno: turnosVigentes){
			if(turno.getHoraFin().before(fechaActual)){
				anunciarFinTurno(turno.getHabitacion().getNombre());
			}
			else{
				long milisegRestantes = (turno.getHoraFin().getTime())-fechaActual.getTime(); 
				if(milisegRestantes<=600000){

					anunciarProntoFinTurno(turno.getHabitacion().getNombre(), milisegRestantes); 
					Timer timer = new Timer((int) milisegRestantes, (new ActionListener () { 
						public void actionPerformed(ActionEvent e){ 
					        anunciarFinTurno(turno.getHabitacion().getNombre());
					     } 
					})); 
					timer.setActionCommand(turno.getHabitacion().getNombre());
					timer.start();
					timer.setRepeats(false);
					timers.add(timer);
					
				}
				else{
					
					Timer timer = new Timer((int) (milisegRestantes-600000), (new ActionListener () { 
						public void actionPerformed(ActionEvent e){ 
					        anunciarProntoFinTurno(turno.getHabitacion().getNombre(),600000);
					     } 
					})); 
					timer.setActionCommand(turno.getHabitacion().getNombre());
					timer.start();
					timer.setRepeats(false);
					timers.add(timer);

					timer = new Timer((int) (milisegRestantes), (new ActionListener () { 
						public void actionPerformed(ActionEvent e){ 
					        anunciarFinTurno(turno.getHabitacion().getNombre());
					     } 
					})); 
					timer.setActionCommand(turno.getHabitacion().getNombre());
					timer.start();
					timer.setRepeats(false);
					timers.add(timer);

					
				}
			}
		}

	}

	public void abrirPanelHabitaciones() {
		habitaciones = daoHabitacion.list(Habitacion.class.getName());
		Object [] nombresHab = new Object [habitaciones.size()];
		for( int i = 0; i< habitaciones.size(); i++){
			nombresHab[i]=habitaciones.get(i).getNombre();
		}
		mainFrame.setPanel(new Habitaciones(nombresHab));
		
		for(Turno turno: turnosVigentes){
			Date horaActual = new Date();
			long milisegRestantes = turno.getHoraFin().getTime() - horaActual.getTime();
			if(milisegRestantes > 600000){
				//color OCUPADO
				//((JButton)mainFrame.getComponent(turno.getHabitacion().getNombre())).setBackground(Habitaciones.OCUPADA);
				mainFrame.cambiarEstado(null,turno.getHabitacion().getNombre(),"ocupado");
			}
			else if (milisegRestantes < 600000 && milisegRestantes > 0){
				//color PROXIMO DESOCUPARSE
				//((JButton)mainFrame.getComponent(turno.getHabitacion().getNombre())).setBackground(Habitaciones.PRONTO_DISPONIBLE);
				mainFrame.cambiarEstado(null,turno.getHabitacion().getNombre(),"pronto_disponible");
			}
			else{
				//color EXCEDIDO
				//((JButton)mainFrame.getComponent(turno.getHabitacion().getNombre())).setBackground(Habitaciones.EXCEDIDA);
				mainFrame.cambiarEstado(null,turno.getHabitacion().getNombre(),"excedido");
			}
		}
		// al comienzo poner todo de color disponible, luego por cada turno dependiendo de lo que 
		// le falte setear color ocupado o por desocuparse. Pasar tmb combo con lista de habitaciones
		mostrarInformacionHabitacion("12");
		for(Habitacion habitacion: habitaciones){
		
			switch(habitacion.getEstado()){
			case DISPONIBLE:
				//((JButton)mainFrame.getComponent(habitacion.getNombre())).setBackground(Habitaciones.DISPONIBLE);
				break;

			case EXCEDIDO:
				//((JButton)mainFrame.getComponent(habitacion.getNombre())).setBackground(Habitaciones.EXCEDIDA);
				mainFrame.cambiarEstado(null,habitacion.getNombre(),"excedido");
				break;

			case MANTENIMIENTO:
				//((JButton)mainFrame.getComponent(habitacion.getNombre())).setBackground(Habitaciones.EN_MANTENIMIENTO);
				mainFrame.cambiarEstado(null,habitacion.getNombre(),"mantenimiento");
				break;

			case OCUPADO:
				//((JButton)mainFrame.getComponent(habitacion.getNombre())).setBackground(Habitaciones.OCUPADA);
				mainFrame.cambiarEstado(null,habitacion.getNombre(),"ocupado");
				break;

			case PRONTO_DISPONIBLE:
				//((JButton)mainFrame.getComponent(habitacion.getNombre())).setBackground(Habitaciones.PRONTO_DISPONIBLE);
				mainFrame.cambiarEstado(null,habitacion.getNombre(),"pronto_disponible");
				break;

			case RESERVADO:
				//((JButton)mainFrame.getComponent(habitacion.getNombre())).setBackground(Habitaciones.RESERVADO);
				mainFrame.cambiarEstado(null,habitacion.getNombre(),"reservado");
				break;

			}
		}
	}

	public void mostrarInformacionHabitacion(String nombreHabitacion) {
		
		boolean ocupado = false;
		for(Turno turno: turnosVigentes){
			if(turno.getHabitacion().getNombre().equals(nombreHabitacion)){
				ocupado = true;
				Object [] valores = turno.toArray();
				mainFrame.setProperty("fecha", valores[0]);
				mainFrame.setProperty("nombre", "Habitaci\u00F3n: " + valores[1]);
				mainFrame.setProperty("hora_inicio", valores[3]);
				mainFrame.setProperty("hora_fin", valores[4]);
				mainFrame.setProperty("tiempo_transcurrido", valores[5]);
				String [] strings = turno.getTimeLeft().toLocaleString().split(" ");
				mainFrame.setProperty("tiempo_restante", strings[1]);
				mainFrame.setProperty("monto_habitacion", valores[6]);
				mainFrame.setProperty("monto_consumicion", valores[7]);
				mainFrame.setProperty("monto_total", valores[8]);
				
				mainFrame.habilitarBotones();
				
				Set <BajaConsumicion> consumiciones = turno.getBajaConsumicions();
				List <Object[]> list = new ArrayList <Object[]>();
				
				tablaConsumiciones = new ArrayList <Integer> ();
				for(BajaConsumicion cons: consumiciones){
					list.add(cons.toArray());
					tablaConsumiciones.add(cons.getIdBajaConsumicion());
				}
				
				mainFrame.setTableModel("consumiciones", list);
			}
			}
		if(!ocupado){
			mainFrame.setProperty("estado", "Disponible");
			mainFrame.setProperty("nombre", "Habitaci\u00F3n: "+ nombreHabitacion);

			mainFrame.setProperty("fecha", "");
			mainFrame.setProperty("hora_inicio", "");
			mainFrame.setProperty("hora_fin", "");
			mainFrame.setProperty("tiempo_transcurrido", "");
			mainFrame.setProperty("tiempo_restante", "");
			mainFrame.setProperty("monto_habitacion", "");
			mainFrame.setProperty("monto_consumicion", "");
			mainFrame.setProperty("monto_total", "");
			mainFrame.setTableModel("consumiciones",new ArrayList <Object[]> ());
			
			mainFrame.deshabilitarBotones();


		}
		for(Habitacion hab: habitaciones)
			if(hab.getNombre().equals(nombreHabitacion))mainFrame.setProperty("estado",hab.getEstado().toString());

		// buscar en la lista de turnos por el nombre de la habitacion,  
		// si existe se setea la info del turno, si no existe esta disponible.
		
	}

	public void mostrarIniciarTurno(String nombreHabitacion) {

		Habitacion habitacion = null;
		
		for(final Habitacion hab : habitaciones){ // SE BUSCA LA HABITACION.
			if(hab.getNombre().equals(nombreHabitacion)){
					habitacion = hab;		
			}
		}
		if(!habitacion.getEstado().equals(EstadoHabitacion.DISPONIBLE)){
			//mensaje error "La habitacion seleccionada no se encuentra disponible"
			 mainFrame.showMessage(MessageType.ERROR, "La habitaci\u00F3n seleccionada no se encuentra disponible");
		}
		else{
			TipoHabitacion tipoHabitacion = habitacion.getTipoHabitacion();
			Calendar timeActual = Calendar.getInstance();
			int dia = timeActual.get(Calendar.DAY_OF_WEEK);
			int hora = timeActual.get(Calendar.HOUR);
			int duracion = tipoHabitacion.getMinutosTiempoInicial(dia, hora);
			new IniciarTurno(nombreHabitacion,timeActual.getTime(),duracion);
			
		}	
	}

	public void iniciarTurno(final String nombreHabitacion, Date dateInicio, Integer duracionMinutos) {
		// Crear timer cuando se inicializa. Calcular monto habitacion. terminado false.
		Habitacion habitacion = null;
		
		for(final Habitacion hab : habitaciones){ // SE BUSCA LA HABITACION.
			if(hab.getNombre().equals(nombreHabitacion)){
					habitacion = hab;		
			}
		}
		if(habitacion==null) mainFrame.showMessage(MessageType.ERROR, "No se puede iniciar el turno.");// NO SE ENCUENTRA, NO EXISTE, NO SE SELECCIONO.
		else{
			
		if(!habitacion.getEstado().equals(EstadoHabitacion.DISPONIBLE)){
			//mensaje error "La habitacion seleccionada no se encuentra disponible"
			 mainFrame.showMessage(MessageType.ERROR, "La habitaci\u00F3n seleccionada no se encuentra disponible");
		}
		else{

			Turno turnoNuevo = new Turno(ControlSesion.getInstance().getActiveSesion(),habitacion,dateInicio,duracionMinutos);//crear turno

			try{
				daoTurno.save(Turno.class.getName(), turnoNuevo);
				ControlSesion.getInstance().getActiveSesion().getTurnos().add(turnoNuevo);
				turnosVigentes.add(turnoNuevo);
				
				final Date horaFin = turnoNuevo.getHoraFin();

				Timer timer = new Timer((int) (horaFin.getTime()-(new Date()).getTime()),new ActionListener () { 
					public void actionPerformed(ActionEvent e){ 
						anunciarFinTurno(nombreHabitacion);
					}} );
				timer.setActionCommand(nombreHabitacion);
				timer.start();
				timer.setRepeats(false);
				timers.add(timer);

				timer = new Timer((int) (horaFin.getTime()-(new Date()).getTime()-600000),new ActionListener () { 
					public void actionPerformed(ActionEvent e){ 
						anunciarProntoFinTurno(nombreHabitacion,horaFin.getTime()-(new Date()).getTime()-600000);
					}} );
				timer.setActionCommand(nombreHabitacion);
				timer.start();
				timer.setRepeats(false);
				timers.add(timer);

				//((JButton) mainFrame.getComponent(nombreHabitacion)).setBackground(Habitaciones.OCUPADA);
				mainFrame.cambiarEstado(null,habitacion.getNombre(),"ocupado");
				mostrarInformacionHabitacion(nombreHabitacion);
				
				 }catch(ConstraintViolationException cve){
				//mensajes error
					 cve.printStackTrace();
					 HibernateUtil.getSession().getTransaction().rollback();
				for(ConstraintViolation constraintViolation : cve.getConstraintViolations()){
					mainFrame.setErrorMessage(constraintViolation.getPropertyPath().toString(), constraintViolation.getMessage());
				}

			}


		}
		
		}


	}

	private void anunciarProntoFinTurno(String nombreHabitacion, long milisegRestantes){
		// pasar hora inicio, hora fin, tiempo restante
		//cambiar hab a color PRONTO DISPONIBLE
		
		for(Turno turno: turnosVigentes){
			if(turno.getHabitacion().getNombre().equals(nombreHabitacion)){
				turno.getHabitacion().setEstado(EstadoHabitacion.PRONTO_DISPONIBLE);
				String [] strings = turno.getHoraInicio().toLocaleString().split(" ");
				String horaInicio = strings[1];
				strings = turno.getHoraFin().toLocaleString().split(" ");
				String horaFin = strings[1];
				Date date = turno.getTimeLeft();
				strings = date.toLocaleString().split(" ");
				String tiempoRestante = strings[1]; 
				
				
				new ProntoFinTurno(nombreHabitacion,horaInicio,horaFin,tiempoRestante);
				JButton boton = ((JButton) mainFrame.getComponent(nombreHabitacion));
				if(boton!=null){
					//boton.setBackground(Habitaciones.PRONTO_DISPONIBLE);
					mainFrame.cambiarEstado(null,nombreHabitacion,"pronto_disponible");
					mostrarInformacionHabitacion(nombreHabitacion);
				}
			}
		}
		
	}
	
	public void anunciarFinTurno(String nombreHabitacion){
		// pasar hora inicio, hora fin, tiempo total, tiempo extendido, monto hab, monto consumicion, monto total
		//cambiar hab a color EXCEDIDA

		for(Turno turno: turnosVigentes){
			if(turno.getHabitacion().getNombre().equals(nombreHabitacion)){
				
				Object[] strings = turno.toArray();
				String horaInicio = (String) strings[3];
				String horaFin = (String) strings[4];
				Date date = new Date(new Date().getTime() - turno.getHoraInicio().getTime()-75600000);
				String [] split = date.toLocaleString().split(" ");
				String tiempoTotal = split[1];
				String tiempoExtendido = "00:00:00";
				if(new Date().after(turno.getHoraFin())){
					date = new Date(new Date().getTime() - turno.getHoraFin().getTime()-75600000);
					split = date.toLocaleString().split(" ");
					tiempoExtendido = split[1];
					
					turno.getHabitacion().setEstado(EstadoHabitacion.EXCEDIDO);
					
					JButton boton = ((JButton) mainFrame.getComponent(nombreHabitacion));
					if(boton!=null){			
						//boton.setBackground(Habitaciones.EXCEDIDA);
						mainFrame.cambiarEstado(null,nombreHabitacion,"excedido");
						mostrarInformacionHabitacion(nombreHabitacion);
					}
					
				}
				new FinTurno(nombreHabitacion,horaInicio,horaFin,tiempoTotal,tiempoExtendido,""+strings[6],""+strings[7],""+strings[8]);
				

			}
		}

	}
	
	public void finalizarTurno(String nombreHabitacion, Double monto) {
		
		boolean encontrado = false;
		for(Turno turno: turnosVigentes){
			if(turno.getHabitacion().getNombre().equals(nombreHabitacion)){
				turno.getHabitacion().setEstado(EstadoHabitacion.DISPONIBLE);
				encontrado = true;
				turno.setMontoHabitacion(monto);
				turno.setTerminado(true);
				ControlSesion.getInstance().getActiveSesion().finalizarTurno(turno);
				DaoSesion.getInstance().persist(ControlSesion.getInstance().getActiveSesion());
				daoHabitacion.persist(turno); 
				turnosVigentes.remove(turno);
				Component component = mainFrame.getComponent(nombreHabitacion);
				if(component!=null){
					//component.setBackground(Habitaciones.DISPONIBLE);
					mainFrame.cambiarEstado(null,nombreHabitacion,"disponible");
					mostrarInformacionHabitacion(nombreHabitacion);
				}
				
				break;
			}
		}
		if(!encontrado)  mainFrame.showMessage(MessageType.ERROR, "No se puede finalizar el turno."); //error "La habitacion no existe"
		
		
	}

	public void agregarConsumicion(int cantidad, int rowConsumicion, String nombreHabitacion) {
		//  crear consumicion - validar que quede stock
		
		Turno turnoSeleccionado = null;
		for(Turno turno: turnosVigentes){
			if(turno.getHabitacion().getNombre().equals(nombreHabitacion)){
				turnoSeleccionado = turno;
			}
		}
		
		if(turnoSeleccionado == null) {
			//turno no valido o similar
			mainFrame.showMessage(MessageType.ERROR, "NO EXISTE EL TURNO. COMUNICARSE CON EL ADMINISTRADOR.");

		}
		else{
			int idConsumicion = listaConsumicionesPermitidas.get(rowConsumicion);
			Consumicion cons = (Consumicion) DaoStock.getInstance().get(Consumicion.class, idConsumicion);
			if(cons.getStockHeladera()<cantidad){
				//error stock insuficiente
				 mainFrame.showMessage(MessageType.ERROR, "No hay stock suficiente para realizar esta venta");
				
			}
			else{
				BajaConsumicion baja = new BajaConsumicion(cons,ControlSesion.getInstance().getActiveSesion(),turnoSeleccionado,cantidad,0,cantidad*cons.getPrecioUnitario(),"");
				cons.addBajaConsumicion(baja);
				turnoSeleccionado.addConsumicion(baja);

				daoHabitacion.save(BajaConsumicion.class.getName(), baja);
				daoHabitacion.persist(cons);
				daoHabitacion.persist(turnoSeleccionado);
				mainFrame.showMessage(MessageType.EXITO,null);
				mostrarInformacionHabitacion(nombreHabitacion);

			}
			
		}
		
	}

	public void mostrarAgregarConsumicion(String nombreHabitacion) {
		List <Consumicion> consumiciones = DaoStock.getInstance().list(Consumicion.class.getName());
		
		listaConsumicionesPermitidas = new ArrayList <Integer> ();
		List <String> nombresConsumiciones = new ArrayList <String> ();
		
		String [] list = new String[consumiciones.size()+1];
		listaConsumicionesPermitidas.add(-1);
		list[0] = "Seleccionar";
		for(int i=1; i<=consumiciones.size();i++){
			Consumicion cons = consumiciones.get(i-1);
			nombresConsumiciones.add(cons.getNombre());
			listaConsumicionesPermitidas.add(cons.getIdConsumicion());
			list[i]=cons.getNombre();
		}
		
		//crear emergente pasando como parametro list consumiciones
		new AgregarConsumicion(nombreHabitacion,list,"TURNO_NO_FINALIZADO");
		
	}

	public void posponerFinalizacion(String nombreHabitacion,int minutos) {
		// recalcular monto, nuevo timer para avisar y terminar. eliminar el timer para terminar
		
		int i = 0;
		while(i < timers.size()){
			if(timers.get(i).getActionCommand().equals(nombreHabitacion)){
				timers.get(i).stop();
				timers.remove(timers.get(i));
			}
			else i++;
		}

		
		final Turno turnoSeleccionado = new Turno();
		for(Turno turno: turnosVigentes){
			if(turno.getHabitacion().getNombre().equals(nombreHabitacion)){
				turno.getHabitacion().setEstado(EstadoHabitacion.OCUPADO);
				turno.getHoraFin().setTime(turno.getHoraFin().getTime() + minutos * 60 * 1000);
				turno.recalcularMontoHabitacion();
				daoTurno.persist(turno);
				turnoSeleccionado.setHabitacion(turno.getHabitacion());
				turnoSeleccionado.setHoraFin(turno.getHoraFin());
			}
		}

		Timer timer = new Timer(((int) turnoSeleccionado.getHoraFin().getTime())-(((int)(new Date().getTime()))),new ActionListener () { 
			public void actionPerformed(ActionEvent e){ 
		        anunciarFinTurno(turnoSeleccionado.getHabitacion().getNombre());
		     }} );
		
		timer.setActionCommand(turnoSeleccionado.getHabitacion().getNombre());
		timer.start();
		timer.setRepeats(false);
		timers.add(timer);
		
		timer = new Timer((int) (turnoSeleccionado.getHoraFin().getTime()-(new Date()).getTime()-600000),new ActionListener () { 
			public void actionPerformed(ActionEvent e){ 
		        anunciarProntoFinTurno(turnoSeleccionado.getHabitacion().getNombre(),turnoSeleccionado.getHoraFin().getTime()-(new Date()).getTime()-600000);
		     }} );
		timer.setActionCommand(turnoSeleccionado.getHabitacion().getNombre());
		timer.start();
		timer.setRepeats(false);
		timers.add(timer);
		
		abrirPanelHabitaciones();

	}

	public void agregarObservacion(String nombreHabitacion, String observacion) {
		
		boolean encontrada = false;
		for(Habitacion hab : habitaciones){
			if(hab.getNombre().equals(nombreHabitacion)){
				Observacion obs = new Observacion(0,ControlSesion.getInstance().getActiveSesion().getUsuario(),hab,observacion,new Date());
				try{
					daoHabitacion.save(Observacion.class.getName(),obs);

					hab.addObservacion(obs);
				}catch(ConstraintViolationException cve){
					//mensajes error
					for(ConstraintViolation constraintViolation : cve.getConstraintViolations()){
						mainFrame.setErrorMessage(constraintViolation.getPropertyPath().toString(), constraintViolation.getMessage());
					}
				}
			}
		}
		
	}
	
	public void eliminarConsumicion(String nombreHabitacion, int rowConsumicion){
		
		boolean confirmado = mainFrame.showMessage(MessageType.CONFIRMACION, null);
		
		if(confirmado){
			int idBaja = tablaConsumiciones.get(rowConsumicion);

			Turno turnoSeleccionado = null;
			for(Turno turno: turnosVigentes){
				if(turno.getHabitacion().getNombre().equals(nombreHabitacion)){
					turnoSeleccionado = turno;
				}
			}

			BajaConsumicion baja = (BajaConsumicion) daoTurno.get(BajaConsumicion.class, idBaja);

			baja.getConsumicion().removeBajaConsumicion(baja);
			turnoSeleccionado.removeConsumicion(baja);
			daoTurno.remove(baja);

			mostrarInformacionHabitacion(nombreHabitacion);
			mainFrame.showMessage(MessageType.EXITO, null); //MUESTRA MENSAJE CONFIRMACION

		}
		
	}

	public void cambiarEstadoMantenimiento(String nombreHabitacion) {
		
		Habitacion habitacion = null;
		for(int i = 0; i < habitaciones.size() ; i++){
			if(habitaciones.get(i).getNombre().equals(nombreHabitacion)){
				habitacion = habitaciones.get(i);
			}
		}
		
		if(habitacion==null)  mainFrame.showMessage(MessageType.ERROR, "No se puede realizar la acci\u00F3n");//error
		else{		
			if(habitacion.cambiarEstado(EstadoHabitacion.MANTENIMIENTO)){
				//((JButton)mainFrame.getComponent(nombreHabitacion)).setBackground(Habitaciones.EN_MANTENIMIENTO);
				mainFrame.cambiarEstado(null,nombreHabitacion,"mantenimiento");
				mainFrame.setProperty("estado", habitacion.getEstado().toString());
			}
			else if(habitacion.getEstado().equals(EstadoHabitacion.MANTENIMIENTO)){
				habitacion.cambiarEstado(EstadoHabitacion.DISPONIBLE);
				//((JButton)mainFrame.getComponent(nombreHabitacion)).setBackground(Habitaciones.DISPONIBLE);
				mainFrame.cambiarEstado(null,nombreHabitacion,"disponible");
				mainFrame.setProperty("estado", habitacion.getEstado().toString());

			}
			else{
				//ERROR -> La habitacion debe estar disponible para colocarla en mantenimiento.
				 mainFrame.showMessage(MessageType.ERROR, "La habitaci\u00F3n debe estar disponible para colocarla en mantenimiento.");
			}
			
			daoHabitacion.persist(habitacion);

		}
	}
		
		public void cambiarEstadoReservado(String nombreHabitacion) {
			
			Habitacion habitacion = null;
			for(int i = 0; i < habitaciones.size() ; i++){
				if(habitaciones.get(i).getNombre().equals(nombreHabitacion)){
					habitacion = habitaciones.get(i);
				}
			}
			
			if(habitacion==null) mainFrame.showMessage(MessageType.ERROR, "No se puede realizar la acci\u00F3n");//error
			else{		
				if(habitacion.cambiarEstado(EstadoHabitacion.RESERVADO)){
					//((JButton)mainFrame.getComponent(nombreHabitacion)).setBackground(Habitaciones.RESERVADO);
					mainFrame.cambiarEstado(null,nombreHabitacion,"reservado");
					mainFrame.setProperty("estado", habitacion.getEstado().toString());
				}
				else if(habitacion.getEstado().equals(EstadoHabitacion.RESERVADO)){
					habitacion.cambiarEstado(EstadoHabitacion.DISPONIBLE);
					//((JButton)mainFrame.getComponent(nombreHabitacion)).setBackground(Habitaciones.DISPONIBLE);
					mainFrame.cambiarEstado(null,nombreHabitacion,"disponible");
					mainFrame.setProperty("estado", habitacion.getEstado().toString());

				}
				else{
					//ERROR -> La habitacion debe estar disponible para reservarla.
					 mainFrame.showMessage(MessageType.ERROR, "La habitaci\u00F3n debe estar disponible para reservarla.");
				}
				
				daoHabitacion.persist(habitacion);

			}
	}
}
